gl renderer: Add NodeSample
authorTimm Bäder <mail@baedert.org>
Sun, 2 Dec 2018 09:20:59 +0000 (10:20 +0100)
committerTimm Bäder <mail@baedert.org>
Sun, 2 Dec 2018 12:25:43 +0000 (13:25 +0100)
As a quick way of checking what a particular sample of nodes (e.g. all
offset node children) are made up of.

gsk/gl/gskglnodesample.c [new file with mode: 0644]
gsk/gl/gskglnodesampleprivate.h [new file with mode: 0644]
gsk/gl/gskglrenderer.c
gsk/meson.build

diff --git a/gsk/gl/gskglnodesample.c b/gsk/gl/gskglnodesample.c
new file mode 100644 (file)
index 0000000..1ee64c7
--- /dev/null
@@ -0,0 +1,51 @@
+
+#include <glib/gprintf.h>
+#include "gskglnodesampleprivate.h"
+#include "gskrendernodeprivate.h"
+
+void
+node_sample_init (NodeSample *self)
+{
+  memset (self->nodes, 0, sizeof (self->nodes));
+  self->count = 0;
+}
+
+void
+node_sample_reset (NodeSample *self)
+{
+  node_sample_init (self);
+}
+
+void
+node_sample_add (NodeSample    *self,
+                 GskRenderNode *node)
+{
+  const guint node_type = gsk_render_node_get_node_type (node);
+
+  g_assert (node_type <= N_NODE_TYPES);
+
+  if (self->nodes[node_type].class_name == NULL)
+    self->nodes[node_type].class_name = node->node_class->type_name;
+
+  self->nodes[node_type].count ++;
+  self->count ++;
+}
+
+void
+node_sample_print (const NodeSample *self,
+                   const char       *prefix)
+{
+  guint i;
+
+  g_printf ("%s:\n", prefix);
+
+  for (i = 0; i < N_NODE_TYPES; i ++)
+    {
+      if (self->nodes[i].count > 0)
+        {
+          double p = (double)self->nodes[i].count / (double)self->count;
+
+          g_printf ("%s: %u (%.2f%%)\n", self->nodes[i].class_name, self->nodes[i].count, p * 100.0);
+        }
+    }
+}
diff --git a/gsk/gl/gskglnodesampleprivate.h b/gsk/gl/gskglnodesampleprivate.h
new file mode 100644 (file)
index 0000000..a1d09a0
--- /dev/null
@@ -0,0 +1,28 @@
+
+#ifndef __GSK_GL_NODE_SAMPLE_PRIVATE_H__
+#define __GSK_GL_NODE_SAMPLE_PRIVATE_H__
+
+#include <glib.h>
+#include "gskenums.h"
+#include "gskrendernode.h"
+
+/* TODO: We have no other way for this...? */
+#define N_NODE_TYPES (GSK_DEBUG_NODE + 1)
+
+typedef struct
+{
+  struct {
+    const char *class_name;
+    guint count;
+  } nodes[N_NODE_TYPES];
+  guint count;
+} NodeSample;
+
+void node_sample_init  (NodeSample       *self);
+void node_sample_reset (NodeSample       *self);
+void node_sample_add   (NodeSample       *self,
+                        GskRenderNode    *node);
+void node_sample_print (const NodeSample *self,
+                        const char       *prefix);
+
+#endif
index 81453b421afc133c0e3234990b864fe868ba28e4..28d475491d7f799c8abc5efa30bee8d961073542 100644 (file)
@@ -14,6 +14,7 @@
 #include "gskglrenderopsprivate.h"
 #include "gskcairoblurprivate.h"
 #include "gskglshadowcacheprivate.h"
+#include "gskglnodesampleprivate.h"
 
 #include "gskprivate.h"
 
index 8ad27f7de65231e58e4189e536ac367555859c2e..9b3db2beac6118a4dc1243fddef0a9c3547d6947 100644 (file)
@@ -43,6 +43,7 @@ gsk_private_sources = files([
   'gl/gskgldriver.c',
   'gl/gskglrenderops.c',
   'gl/gskglshadowcache.c',
+  'gl/gskglnodesample.c',
 ])
 
 gsk_public_headers = files([